#pragma once
#ifndef MODE_CHOSE_H
#define MODE_CHOSE_H

#include "eu_harmonic.h"
#include <iostream>
#include <thread>
using namespace std;

// 设置电机ID
#define Motor1 21
#define Motor2 22
#define Motor3 23
#define Motor0 20   // 电机归位参数, 没有实际物理电机相对应

// 设置CAN口id
#define canid 0

#define turn 18000     //分度值
enum vel_chose
{
    vel_common = 100000,
    vel_2 = 200000,
    vel_4 = 400000,
    vel_6 = 600000,
    vel_8 = 800000,
    vel_10 = 1000000,
    vel_12 = 1200000
};


/*
    \brief 显示节点信息
    \param m_id 电机号
*/
void mode_show(int m_id);

/*
    单个电机的运动控制程序
    \param MotorId 电机的Id
    \param TargetPosition 目标角度(可正可负)
    \param velocity 设置速度
    \return 0: 运行成功, other: 运行失败
*/
int SingleMotorMovingControl(int MotorId, int TargetPosition, int velocity);

/*
    \brief 将三个电机全部置于原点(立即执行)
    \return 0:运行成功, -1: 运行失败
    \note 该函数自带延时
*/
int MotorsMoveBack();

/*
    \brief 进行 Ctrl + C 的异常处理
    \note signum形参不用自己输入, 运行时会检测 Ctrl + C
    \note 该函数自带3秒延迟, 切记按下一次 Ctrl + C 即可
*/
void signal_handler(int signum);        // 捕获 Ctrl+C 信号并执行相应操作

/*
    \brief 对指定的电机进行延迟
    \param MotorNum 指定需要延时的电机Id
    \param targetangle MotorNum所指电机本次操作的目标角度 - 通过判断是否达到目标角度来自动确定延迟时间
    \note 如需额外增加延时, 可用一下操作: std::this_thread::sleep_for(std::chrono::milliseconds(3000));
*/
void MotorDelay(int MotorNum, int targetangle);              // 延时函数: (电机Id, 目标角度)

/*
    \brief 电机1从0-angle往返20次
    \param angle 电机1的目标角度
    \param maximun 电机1能够运行的最大角度
    \note 该函数功能已废
*/
void Motor1Moving(int angle, int maximun);

/*
    \brief 电机的运行程序 - 到目标角度结束
    \param motornum 电机Id
    \param angle 目标角度
    \param maximun 电机最大旋转角度
*/
void MotorMoving(int motornum, int angle, int maximun);

#endif // MODE_CHOSE_H
